home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 6: Level 6 / 17 Bit - Level 6 (1998)(Epic Marketing)[!].iso / quartz / q1082.dms / q1082.adf / src.lzh / Fig / Zoom.c < prev   
C/C++ Source or Header  |  1991-07-18  |  4KB  |  159 lines

  1. #define ZOOMWIDTH    40
  2. #define ZOOMHEIGHT    40
  3.  
  4. extern struct ExecBase    *SysBase;
  5. extern struct Screen    *Screen;
  6.  
  7. struct Window        *ZoomWindow;
  8. struct BitMap         ZoomSrcBitMap,ZoomDstBitMap;
  9. struct RastPort         ZoomSrcRPort;
  10. struct BitScaleArgs     ScaleArgs;
  11. SHORT             ZoomToX,ZoomToY;
  12.  
  13. struct NewWindow NewZoomWindow =
  14. {
  15.     0,12,
  16.     100,100,
  17.     0,1,
  18.     CLOSEWINDOW | NEWSIZE,
  19.     RMBTRAP | WINDOWSIZING | WINDOWDRAG | WINDOWCLOSE,
  20.     (struct Gadget *)NULL,
  21.     (struct Image *)NULL,
  22.     (STRPTR)"Fig Zoom Window",
  23.     (struct Screen *)NULL,
  24.     (struct BitMap *)NULL,
  25.     50,50,
  26.     ~0,~0,
  27.     CUSTOMSCREEN
  28. };
  29.  
  30. VOID
  31. DeleteZoomBitMap()
  32. {
  33.     if(ZoomSrcBitMap . Planes[0])
  34.     {
  35.         FreeMem(ZoomSrcBitMap . Planes[0],ZoomSrcBitMap . BytesPerRow * ZoomSrcBitMap . Rows);
  36.  
  37.         ZoomSrcBitMap . Planes[0] = NULL;
  38.     }
  39.  
  40.     if(ZoomDstBitMap . Planes[0])
  41.     {
  42.         FreeMem(ZoomDstBitMap . Planes[0],ZoomDstBitMap . BytesPerRow * ZoomDstBitMap . Rows);
  43.  
  44.         ZoomDstBitMap . Planes[0] = NULL;
  45.     }
  46. }
  47.  
  48. BYTE
  49. CreateZoomBitMap()
  50. {
  51.     SHORT ScaleX,ScaleY;
  52.  
  53.     ZoomToX = ZoomWindow -> Width - (ZoomWindow -> BorderLeft + ZoomWindow -> BorderRight);
  54.     ZoomToY = ZoomWindow -> Height - (ZoomWindow -> BorderTop + ZoomWindow -> BorderBottom);
  55.  
  56.     ScaleArgs . bsa_SrcWidth    = ZOOMWIDTH;
  57.     ScaleArgs . bsa_SrcHeight    = ZOOMHEIGHT;
  58.  
  59.     ScaleArgs . bsa_XSrcFactor    = 1;
  60.     ScaleArgs . bsa_YSrcFactor    = 1;
  61.  
  62.     ScaleArgs . bsa_XDestFactor    = (ZoomToX + ZOOMWIDTH - 1)  / ZOOMWIDTH;
  63.     ScaleArgs . bsa_YDestFactor    = (ZoomToY + ZOOMHEIGHT - 1) / ZOOMHEIGHT;
  64.  
  65.     ScaleArgs . bsa_SrcBitMap    = &ZoomSrcBitMap;
  66.     ScaleArgs . bsa_DestBitMap    = &ZoomDstBitMap;
  67.  
  68.     SetDrMd(ZoomWindow -> RPort,JAM2);
  69.     SetAPen(ZoomWindow -> RPort,0);
  70.     RectFill(ZoomWindow -> RPort,ZoomWindow -> BorderLeft,ZoomWindow -> BorderTop,ZoomWindow -> BorderLeft + ZoomToX - 1,ZoomWindow -> BorderTop + ZoomToY - 1);
  71.  
  72.     SetDrMd(ZoomWindow -> RPort,COMPLEMENT);
  73.     SetAPen(ZoomWindow -> RPort,1);
  74.  
  75.     ScaleX = ScalerDiv(ZOOMWIDTH,ScaleArgs . bsa_XDestFactor,ScaleArgs . bsa_XSrcFactor);
  76.     ScaleY = ScalerDiv(ZOOMHEIGHT,ScaleArgs . bsa_YDestFactor,ScaleArgs . bsa_YSrcFactor);
  77.  
  78.     InitBitMap(&ZoomSrcBitMap,1,ZOOMWIDTH,ZOOMHEIGHT);
  79.     InitBitMap(&ZoomDstBitMap,1,ScaleX,ScaleY);
  80.  
  81.     InitRastPort(&ZoomSrcRPort);
  82.  
  83.     if(ZoomSrcBitMap . Planes[0] = (PLANEPTR)AllocMem(ZoomSrcBitMap . BytesPerRow * ZoomSrcBitMap . Rows,MEMF_CHIP|MEMF_CLEAR))
  84.     {
  85.         ZoomSrcRPort . BitMap = &ZoomSrcBitMap;
  86.  
  87.         if(ZoomDstBitMap . Planes[0] = (PLANEPTR)AllocMem(ZoomDstBitMap . BytesPerRow * ZoomDstBitMap . Rows,MEMF_CHIP|MEMF_CLEAR))
  88.             return(TRUE);
  89.     }
  90.  
  91.     DeleteZoomBitMap();
  92.  
  93.     return(FALSE);
  94. }
  95.  
  96. VOID
  97. CloseZoomWindow()
  98. {
  99.     DeleteZoomBitMap();
  100.  
  101.     if(ZoomWindow)
  102.     {
  103.         NewZoomWindow . LeftEdge    = ZoomWindow -> LeftEdge;
  104.         NewZoomWindow . TopEdge        = ZoomWindow -> TopEdge;
  105.         NewZoomWindow . Width        = ZoomWindow -> Width;
  106.         NewZoomWindow . Height        = ZoomWindow -> Height;
  107.  
  108.         CloseWindow(ZoomWindow);
  109.  
  110.         ZoomWindow = NULL;
  111.     }
  112. }
  113.  
  114. BYTE
  115. OpenZoomWindow()
  116. {
  117.     WORD Dims[4];
  118.  
  119.     NewZoomWindow . Screen = Screen;
  120.  
  121.     Dims[0] = NewZoomWindow . LeftEdge;
  122.     Dims[1] = NewZoomWindow . TopEdge;
  123.     Dims[2] = NewZoomWindow . Width;
  124.     Dims[3] = NewZoomWindow . Height;
  125.  
  126.     if(ZoomWindow = (struct Window *)OpenWindowTags(&NewZoomWindow,
  127.         WA_Zoom,&Dims[0],
  128.     TAG_DONE))
  129.     {
  130.         if(CreateZoomBitMap())
  131.             return(TRUE);
  132.  
  133.         CloseWindow(ZoomWindow);
  134.  
  135.         DisplayBeep(Screen);
  136.     }
  137.  
  138.     return(FALSE);
  139. }
  140.  
  141. VOID
  142. ZoomToWindow(struct RastPort *RPort,SHORT X,SHORT Y,SHORT OffsetX,SHORT OffsetY)
  143. {
  144.     ClipBlit(RPort,X,Y,&ZoomSrcRPort,0,0,ZOOMWIDTH,ZOOMHEIGHT,0xC0);
  145.  
  146.     BitMapScale(&ScaleArgs);
  147.  
  148.     BltBitMapRastPort(&ZoomDstBitMap,0,0,ZoomWindow -> RPort,ZoomWindow -> BorderLeft,ZoomWindow -> BorderTop,ZoomToX,ZoomToY,0xC0);
  149.  
  150.     OffsetX = OffsetX * ScaleArgs . bsa_XDestFactor;
  151.     OffsetY = OffsetY * ScaleArgs . bsa_YDestFactor;
  152.  
  153.     Move(ZoomWindow -> RPort,ZoomWindow -> BorderLeft + OffsetX,ZoomWindow -> BorderTop);
  154.     Draw(ZoomWindow -> RPort,ZoomWindow -> BorderLeft + OffsetX,ZoomWindow -> BorderTop + ZoomToY - 1);
  155.  
  156.     Move(ZoomWindow -> RPort,ZoomWindow -> BorderLeft,ZoomWindow -> BorderTop + OffsetY);
  157.     Draw(ZoomWindow -> RPort,ZoomWindow -> BorderLeft + ZoomToX - 1,ZoomWindow -> BorderTop + OffsetY);
  158. }
  159.